import { createServer } from 'http';
import { join as path_join } from 'path';
import { exec } from 'child_process';
import express from 'express';
import bodyParser from 'body-parser';
import cors from 'cors';
import Config from './Config'
import 'sqlite3/lib/binding/napi-v6-win32-unknown-x64/node_sqlite3.node';
import {LRUCache} from 'lru-cache'
import Fs from 'fs-extra'


const app = express();
const server = createServer(app);

// 使用 body-parser 中间件来解析 JSON 和 URL 编码的请求体
app.use(bodyParser.json());

app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
// 指定静态文件目录，例如 js、css、img 等
let publicPath = path_join(Config.root_dir, "public");
app.use(express.static(publicPath));



import Sql from './Controller/Sql';
import Tpl from './Controller/Tpl';
import CreateTpl from './Controller/CreateTpl';
import Port from './Controller/Port'
import RunTpl from './Controller/RunTpl'
import GlobalStyle from './Controller/edit/GlobalStyle';
import Setting from './Controller/Setting'
import WeiXinTool from './Controller/WeiXinTool';
import Pages from './Controller/edit/Pages';
import TplPages from './Controller/TplPages'
import Components from './Controller/Components';

// 创建缓存
const Cache = new LRUCache({
  max: 500
})

// 将src的组件文件夹创建软连接到source项目目录下
if(!Fs.existsSync(path_join(Config.root_dir,"source","src","components"))) {
  Fs.symlinkSync(
    path_join(Config.root_dir,"components"),
    path_join(Config.root_dir,"source","src","components"), 
    "junction"
 )
}


// 初始化创建数据表
new Sql().create();







// 添加模板
app.post("/tpl/add",(req,res)=>{
  new Tpl(req,res).add()
});

// 获取模板列表
app.get("/tpl/get",(req,res) => {
  new Tpl(req,res).get()
});

// 删除项目
app.post("/tpl/remove",(req,res) => {
  new Tpl(req,res).remove()
});

// 初始化模板项目
app.post("/tpl/create",(req,res) => {
  new CreateTpl(req,res).create() 
});

// 端口管理
app.post("/port/stopPort",(req,res)=>{
  new Port(req,res).stopPort();
})

// 运行tpl模板项目
app.post("/tpl/run",(req,res) => {
  new RunTpl(req,res).run(Cache); 
})

// 创建项目封面
app.post("/tpl/createThumb",(req,res) => {
  new Tpl(req,res).createThumb(Cache);
}) 

// 提交设置项目全局配置
app.post("/edit/globalStyle",(req,res) => {
  new GlobalStyle(req,res).submit(); 
})

// 获取项目的全局配置
app.get("/edit/globalStyle",(req,res) => {
  new GlobalStyle(req,res).get(); 
})

// 提交设置某个页面的配置
app.post("/edit/pages",(req,res) => {
  new Pages(req,res).submit(); 
})

// 获取项目某个页面的配置
app.get("/edit/pages",(req,res) => {
  new Pages(req,res).get()
})
 

// 获取系统配置
app.get("/setting/get",(req,res) => {
  new Setting(req,res).get();
})

// 设置系统配置
app.post("/setting/set",(req,res) => {
  new Setting(req,res).set();
})

// 打开微信开发工具
app.post("/WeiXinTool/open",(req,res) => {
  new WeiXinTool(req,res).open(Cache);
})

// 获取所有组件列表
app.get("/components/getAll",(req,res) => {
  new Components(req,res).getAll()
})

// 获取模板项目所有页面
app.get("/tplPages/getPages",(req,res) => {
  new TplPages(req,res).getPages() 
})

















// 监听端口
const port = 9287;
server.listen(port, () => {
    console.log("\x1b[32m%s\x1b[0m","请在浏览器打开链接：http://localhost:"+port)
    if(process.argv[1].slice(-2) != 'ts') {
      exec(`start http://localhost:${port}`);
    }
});